Private Sub bgSendFile_DoWork(ByVal sender As Object, ByVal e As DoWorkEventArgs) Handles bgSendFile.DoWork
'Ottiene il nome del file dall'argomento passato al metodo
'RunWorkerAsync nella procedura precedente
Dim FileName As String = e.Argument
'Crea un nuovo lettore del file a basso livello, così
'da poter ottenere bytes di informazione anziché caratteri
'come nello StreamReader
Dim Reader As New IO.FileStream(FileName, IO.FileMode.Open)
'Calcola la grandezza del file, per poter poi tenere
'l'utente al corrente della percentuale di completamento
Dim Size As Int64 = FileLen(FileName)
'Un blocco di bytes da 4096 posti. Il file viene spedito in
'"pacchettini" per evitare di sovraccaricare la connessione
Dim Bytes(4095) As Byte
'Se il file è più grande di 4KiB, lo divide
'in blocchi di dati da 4096 bytes
If Size > 4096 Then
For Block As Int64 = 0 To Size Step 4096
'Se i bytes rimanenti sono più di 4096,
'ne legge un blocco intero
If Size - Block >= 4096 Then
Reader.Read(Bytes, 0, 4096)
Else
'Altrimenti un blocco più piccolo
Reader.Read(Bytes, 0, Size - Block)
End If
'Scrive i dati prelevati sullo stream di rete,
'inviandoli così al server
NetFile.Write(Bytes, 0, 4096)
'Riporta la percentuale all'utente
prgProgress.Value = Block * 100 / Size
'Smette per 30ms, così da dare tempo dal
'server di poter processare i pacchetti uno per
'uno, evitando confusione
Threading.Thread.Sleep(30)
If bgSendFile.CancellationPending Then 'If user abort download
NetFile.Write(ASCII.GetBytes("STOP"), 0, 4)
Exit For
End If
Next
ElseIf Size < 4096 Then
'Se il file è minore di 4KiB, lo invia tutto
'direttamente dal server
Reader.Read(Bytes, 0, Size)
NetFile.Write(Bytes, 0, Size)
End If
Reader.Close()
If bgSendFile.CancellationPending Then 'If user abort download
MsgBox("Invio Annullato", MsgBoxStyle.Critical)
Else
'Percentuale massima: lavoro terminato
bgSendFile.ReportProgress(100)
Threading.Thread.Sleep(100)
'Comunica la fine delle operazioni
NetFile.Write(ASCII.GetBytes("END"), 0, 3)
MsgBox("File inviato con successo!", MsgBoxStyle.Information)
cmdSend.Enabled = True
End If
End Sub